// 导入模块
import { useUserStore } from '@/sotre/user'
import Request from 'luch-request'

// 实例化网络请求
const request = new Request({
  // 接口基地址
  baseURL: 'https://consult-api.itheima.net',
  // 只要通过请求对象发请求， custom， loading：true - 自定义属性
  custom: {
    loading: true,
    title: '加载中'
  }
})

// ---------------------------------- 请求拦截器 --------------------------------------------------
request.interceptors.request.use((config) => { 
  // 请求拦截器携带统一携带token， 、
  // 但并不是所有接口请求都需要携带token，比如有三个登录接口不需要携带，要做处理
  
  // 1. 获取存储在pinia中的token
  const user = useUserStore()
  // 2. 创建白名单
  const whitePath = ['/code', '/login', '/login/password']
  // 3. 逻辑判断
  if (user.token && !whitePath.includes(config.url || '')) {
    // 4. 携带token
    config.header!.Authorization = `Bearer ${user.token}`
  }

  if(config.custom?.loading) {
 // 开启loading效果
  uni.showLoading({
    title: config.custom?.title,
    mask:true
  })
  }
  return config
},
 config => { // 可使用async await 做异步操作
  return Promise.reject(config)
})
// --------------------------------------------------------------------




//  --------------------------- 响应拦截器-------------------------------------------
request.interceptors.response.use(  (res) => {

    // 关闭loading效果
    uni.hideLoading()
    // 统一错误处理
    if (res.data.code !== 10000) {
      uni.showToast({
        title: res.data.message,
        icon: 'none'
      })
      return Promise.reject(res.data)
    }
    // 简化数据返回
    return res.data?.data
    // return res
  },
  (error) => {
    // 请求失败也需要关闭loading效果
    uni.hideLoading()
    if (error.data.code === 401) {
      uni.showToast({
        title: error.data.message,
        icon: 'none'
      })
      // 跳转至登录页
      uni.redirectTo({
        url: '/pages/login/index'
      })
    }
    return Promise.reject(error)
  })

// 导出配置好的模网络模块
export { request }